home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / libg_261.zip / libg_261 / libg++ / etc / benchmarks / Int.h < prev    next >
C/C++ Source or Header  |  1994-05-13  |  14KB  |  402 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2. /* 
  3. Copyright (C) 1989 Free Software Foundation
  4.     written by Doug Lea (dl@rocky.oswego.edu)
  5.  
  6. This file is part of GNU CC.
  7.  
  8. GNU CC is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY.  No author or distributor
  10. accepts responsibility to anyone for the consequences of using it
  11. or for whether it serves any particular purpose or works at all,
  12. unless he says so in writing.  Refer to the GNU CC General Public
  13. License for full details.
  14.  
  15. Everyone is granted permission to copy, modify and redistribute
  16. GNU CC, but only under the conditions described in the
  17. GNU CC General Public License.   A copy of this license is
  18. supposed to have been given to you along with GNU CC so you
  19. can know your rights and responsibilities.  It should be in a
  20. file named COPYING.  Among other things, the copyright notice
  21. and this notice must be preserved on all copies.  
  22. */
  23.  
  24. #ifndef _Int_h
  25. #define _Int_h 1
  26.  
  27. /* compile with
  28.  
  29.     -DBUILTIN  - to get standard ints
  30.     -DCALL     - to get calls instead of inlines 
  31.                  (in which case don't use -finline-functions!)
  32.     -DVIRT     - to make all members virtual
  33.     -DBYVAL    - to use call-by-value, not by-reference
  34.             (-DNO_GNU_CONST - to eliminate calling const functions const
  35.               **** REMOVED, NO LONGER SUPPORTED IN g++ ***** )
  36.     -DCONVERT  - to eliminate mixed mode fns that avoid constructors
  37.     -DNO_NRV   - to eliminate use of named return values
  38.     -DFAKEVPTR - to get one pointer per object padding
  39.     -DRETREF   - to make =, +=, etc. return *this, not void
  40. */
  41.  
  42. #ifdef BUILTIN
  43. typedef int Int;
  44. #else
  45.  
  46. #ifdef CALL
  47. #define INLINE
  48. #else
  49. #define INLINE inline
  50. #endif
  51.  
  52. #ifndef VIRT
  53. #define VIRTUAL
  54. #else
  55. #define VIRTUAL virtual
  56. #endif
  57.  
  58. #ifdef BYVAL
  59. #define REF 
  60. #else
  61. #define REF &
  62. #endif
  63.  
  64. #ifndef  CONVERT
  65. #define EXPLICIT
  66. #endif
  67.  
  68. #ifndef RETREF
  69. #define IntR void
  70. #define ReturnIntR 
  71. #else
  72. #define IntR Int&
  73. #define ReturnIntr  return *this
  74. #endif
  75.  
  76. class Int 
  77. {
  78. protected:
  79.   int          rep;
  80. #ifdef FAKEVPTR
  81.   void*        fake_vptr;
  82. #endif
  83. public: 
  84.                Int ();
  85.                Int (const int  b);
  86.                Int (const Int& b);
  87.   VIRTUAL      ~Int();
  88.  
  89.                operator int() const;
  90.  
  91.   VIRTUAL int   val() const;
  92.  
  93.   VIRTUAL IntR operator  = (const int);
  94.   VIRTUAL IntR operator  = (const Int&);
  95.  
  96.   VIRTUAL IntR negate();
  97.   VIRTUAL IntR complement();
  98.   VIRTUAL IntR operator ++ ();
  99.   VIRTUAL IntR operator -- ();
  100.  
  101.   VIRTUAL IntR operator += (const Int REF );
  102.   VIRTUAL IntR operator -= (const Int REF );
  103.   VIRTUAL IntR operator *= (const Int REF );
  104.   VIRTUAL IntR operator /= (const Int REF );
  105.   VIRTUAL IntR operator %= (const Int REF );
  106.   VIRTUAL IntR operator |= (const Int REF );
  107.   VIRTUAL IntR operator &= (const Int REF );
  108.   VIRTUAL IntR operator ^= (const Int REF );
  109.   VIRTUAL IntR operator <<=(const Int REF );
  110.   VIRTUAL IntR operator >>=(const Int REF );
  111.  
  112. #ifdef EXPLICIT
  113.   VIRTUAL IntR operator += (const int);
  114.   VIRTUAL IntR operator -= (const int);
  115.   VIRTUAL IntR operator *= (const int);
  116.   VIRTUAL IntR operator /= (const int);
  117.   VIRTUAL IntR operator %= (const int);
  118.   VIRTUAL IntR operator |= (const int);
  119.   VIRTUAL IntR operator &= (const int);
  120.   VIRTUAL IntR operator ^= (const int);
  121.   VIRTUAL IntR operator <<=(const int);
  122.   VIRTUAL IntR operator >>=(const int);
  123.  
  124. #endif
  125. };
  126.  
  127. INLINE int  Int::val() const { return rep; }
  128. INLINE      Int::operator int() const { return val(); }
  129.  
  130. INLINE      Int::Int () :rep(0) {}
  131. INLINE      Int::Int (const int  b) :rep(b) {}
  132. INLINE      Int::Int (const Int& b) :rep(b.Int::val()) {}
  133. INLINE      Int::~Int() {}
  134.  
  135. INLINE IntR Int::operator  = (const int  b) 
  136. { rep = b; ReturnIntR; }
  137. INLINE IntR Int::operator  = (const Int&  b) 
  138. { rep = b.Int::val(); ReturnIntR; }
  139.  
  140. INLINE IntR Int::complement()
  141. { rep = ~rep; ReturnIntR; }
  142. INLINE IntR Int::negate()
  143. { rep = -rep; ReturnIntR; }
  144. INLINE IntR Int::operator ++ ()        
  145. { ++rep; ReturnIntR; }
  146. INLINE IntR Int::operator -- ()        
  147. { --rep; ReturnIntR; }
  148.  
  149. INLINE IntR Int::operator += (const Int REF  b) 
  150. { rep += b.Int::val(); ReturnIntR; }
  151. INLINE IntR Int::operator -= (const Int REF  b) 
  152. { rep -= b.Int::val(); ReturnIntR; }
  153. INLINE IntR Int::operator *= (const Int REF  b) 
  154. { rep *= b.Int::val(); ReturnIntR; }
  155. INLINE IntR Int::operator /= (const Int REF  b) 
  156. { rep /= b.Int::val(); ReturnIntR; }
  157. INLINE IntR Int::operator %= (const Int REF  b) 
  158. { rep %= b.Int::val(); ReturnIntR; }
  159. INLINE IntR Int::operator |= (const Int REF  b) 
  160. { rep |= b.Int::val(); ReturnIntR; }
  161. INLINE IntR Int::operator &= (const Int REF  b) 
  162. { rep &= b.Int::val(); ReturnIntR; }
  163. INLINE IntR Int::operator ^= (const Int REF  b) 
  164. { rep ^= b.Int::val(); ReturnIntR; }
  165. INLINE IntR Int::operator <<=(const Int REF  b) 
  166. { rep <<= b.Int::val(); ReturnIntR; }
  167. INLINE IntR Int::operator >>=(const Int REF  b) 
  168. { rep >>= b.Int::val(); ReturnIntR; }
  169.  
  170. #ifdef EXPLICIT
  171.  
  172. INLINE IntR Int::operator += (const int b) 
  173. { rep += b; ReturnIntR; }
  174. INLINE IntR Int::operator -= (const int b) 
  175. { rep -= b; ReturnIntR; }
  176. INLINE IntR Int::operator *= (const int b) 
  177. { rep *= b; ReturnIntR; }
  178. INLINE IntR Int::operator /= (const int b) 
  179. { rep /= b; ReturnIntR; }
  180. INLINE IntR Int::operator %= (const int b) 
  181. { rep %= b; ReturnIntR; }
  182. INLINE IntR Int::operator |= (const int b) 
  183. { rep |= b; ReturnIntR; }
  184. INLINE IntR Int::operator &= (const int b) 
  185. { rep &= b; ReturnIntR; }
  186. INLINE IntR Int::operator ^= (const int b) 
  187. { rep ^= b; ReturnIntR; }
  188. INLINE IntR Int::operator <<=(const int b) 
  189. { rep <<= b; ReturnIntR; }
  190. INLINE IntR Int::operator >>=(const int b) 
  191. { rep >>= b; ReturnIntR; }
  192.  
  193.  
  194. INLINE int& operator += (int& a,  const Int REF  b) 
  195. { a += b.Int::val(); return a; }
  196. INLINE int& operator -= (int& a,  const Int REF  b) 
  197. { a -= b.Int::val(); return a;}
  198. INLINE int& operator *= (int& a,  const Int REF  b) 
  199. { a *= b.Int::val(); return a;}
  200. INLINE int& operator /= (int& a,  const Int REF  b) 
  201. { a /= b.Int::val(); return a;}
  202. INLINE int& operator %= (int& a,  const Int REF  b) 
  203. { a %= b.Int::val(); return a;}
  204. INLINE int& operator |= (int& a,  const Int REF  b) 
  205. { a |= b.Int::val(); return a;}
  206. INLINE int& operator &= (int& a,  const Int REF  b) 
  207. { a &= b.Int::val(); return a;}
  208. INLINE int& operator ^= (int& a,  const Int REF  b) 
  209. { a ^= b.Int::val(); return a;}
  210. INLINE int& operator <<=(int& a,  const Int REF  b) 
  211. { a <<= b.Int::val(); return a;}
  212. INLINE int& operator >>=(int& a,  const Int REF  b) 
  213. { a >>= b.Int::val(); return a;}
  214.  
  215. #endif
  216.  
  217. #ifdef _G_NO_NRV
  218.  
  219. INLINE Int  operator -  (const Int REF  a) 
  220. { Int r(a); r.negate(); return r; }
  221. INLINE Int  operator ~  (const Int REF  a) 
  222. { Int r(a); r.complement(); return r; }
  223.  
  224. INLINE Int  operator +  (const Int REF  a, const Int REF  b) 
  225. { Int r(a); r += b.Int::val(); return r; }
  226. INLINE Int  operator -  (const Int REF  a, const Int REF  b) 
  227. { Int r(a); r -= b.Int::val(); return r; }
  228. INLINE Int  operator *  (const Int REF  a, const Int REF  b) 
  229. { Int r(a); r *= b.Int::val(); return r; }
  230. INLINE Int  operator /  (const Int REF  a, const Int REF  b) 
  231. { Int r(a); r /= b.Int::val(); return r; }
  232. INLINE Int  operator %  (const Int REF  a, const Int REF  b) 
  233. { Int r(a); r %= b.Int::val(); return r; }
  234. INLINE Int  operator << (const Int REF  a, const Int REF  b) 
  235. { Int r(a); r <<= b.Int::val(); return r; }
  236. INLINE Int  operator >> (const Int REF  a, const Int REF  b) 
  237. { Int r(a); r >>= b.Int::val(); return r; }
  238. INLINE Int  operator &  (const Int REF  a, const Int REF  b) 
  239. { Int r(a); r &= b.Int::val(); return r; }
  240. INLINE Int  operator |  (const Int REF  a, const Int REF  b) 
  241. { Int r(a); r |= b.Int::val(); return r; }
  242. INLINE Int  operator ^  (const Int REF  a, const Int REF  b) 
  243. { Int r(a); r ^= b.Int::val(); return r; }
  244.  
  245. INLINE Int  operator +  (const Int REF  a, const int b) 
  246. { Int r(a); r += b; return r; }
  247. INLINE Int  operator -  (const Int REF  a, const int b) 
  248. { Int r(a); r -= b; return r; }
  249. INLINE Int  operator *  (const Int REF  a, const int b) 
  250. { Int r(a); r *= b; return r; }
  251. INLINE Int  operator /  (const Int REF  a, const int b) 
  252. { Int r(a); r /= b; return r; }
  253. INLINE Int  operator %  (const Int REF  a, const int b) 
  254. { Int r(a); r %= b; return r; }
  255. INLINE Int  operator << (const Int REF  a, const int b) 
  256. { Int r(a); r <<= b; return r; }
  257. INLINE Int  operator >> (const Int REF  a, const int b) 
  258. { Int r(a); r >>= b; return r; }
  259. INLINE Int  operator &  (const Int REF  a, const int b) 
  260. { Int r(a); r &= b; return r; }
  261. INLINE Int  operator |  (const Int REF  a, const int b) 
  262. { Int r(a); r |= b; return r; }
  263. INLINE Int  operator ^  (const Int REF  a, const int b) 
  264. { Int r(a); r ^= b; return r; }
  265.  
  266. INLINE Int  operator +  (const int a, const Int REF  b) 
  267. { Int r(a); r += b.Int::val(); return r; }
  268. INLINE Int  operator -  (const int a, const Int REF  b) 
  269. { Int r(a); r -= b.Int::val(); return r; }
  270. INLINE Int  operator *  (const int a, const Int REF  b) 
  271. { Int r(a); r *= b.Int::val(); return r; }
  272. INLINE Int  operator /  (const int a, const Int REF  b) 
  273. { Int r(a); r /= b.Int::val(); return r; }
  274. INLINE Int  operator %  (const int a, const Int REF  b) 
  275. { Int r(a); r %= b.Int::val(); return r; }
  276. INLINE Int  operator << (const int a, const Int REF  b) 
  277. { Int r(a); r <<= b.Int::val(); return r; }
  278. INLINE Int  operator >> (const int a, const Int REF  b) 
  279. { Int r(a); r >>= b.Int::val(); return r; }
  280. INLINE Int  operator &  (const int a, const Int REF  b) 
  281. { Int r(a); r &= b.Int::val(); return r; }
  282. INLINE Int  operator |  (const int a, const Int REF  b) 
  283. { Int r(a); r |= b.Int::val(); return r; }
  284. INLINE Int  operator ^  (const int a, const Int REF  b) 
  285. { Int r(a); r ^= b.Int::val(); return r; }
  286.  
  287. #else
  288.  
  289. INLINE Int  operator -  (const Int REF  a) return r(a)
  290. { r.negate();  }
  291. INLINE Int  operator ~  (const Int REF  a) return r(a)
  292. { r.complement();  }
  293.  
  294. INLINE Int  operator +  (const Int REF  a, const Int REF  b) return r(a)
  295. { r += b.Int::val();  }
  296. INLINE Int  operator -  (const Int REF  a, const Int REF  b) return r(a)
  297. { r -= b.Int::val();  }
  298. INLINE Int  operator *  (const Int REF  a, const Int REF  b) return r(a)
  299. { r *= b.Int::val();  }
  300. INLINE Int  operator /  (const Int REF  a, const Int REF  b) return r(a)
  301. { r /= b.Int::val();  }
  302. INLINE Int  operator %  (const Int REF  a, const Int REF  b) return r(a)
  303. { r %= b.Int::val();  }
  304. INLINE Int  operator << (const Int REF  a, const Int REF  b) return r(a)
  305. { r <<= b.Int::val();  }
  306. INLINE Int  operator >> (const Int REF  a, const Int REF  b) return r(a)
  307. { r >>= b.Int::val();  }
  308. INLINE Int  operator &  (const Int REF  a, const Int REF  b) return r(a)
  309. { r &= b.Int::val();  }
  310. INLINE Int  operator |  (const Int REF  a, const Int REF  b) return r(a)
  311. { r |= b.Int::val();  }
  312. INLINE Int  operator ^  (const Int REF  a, const Int REF  b) return r(a)
  313. { r ^= b.Int::val();  }
  314.  
  315. INLINE Int  operator +  (const Int REF  a, const int b) return r(a)
  316. { r += b;  }
  317. INLINE Int  operator -  (const Int REF  a, const int b) return r(a)
  318. { r -= b;  }
  319. INLINE Int  operator *  (const Int REF  a, const int b) return r(a)
  320. { r *= b;  }
  321. INLINE Int  operator /  (const Int REF  a, const int b) return r(a)
  322. { r /= b;  }
  323. INLINE Int  operator %  (const Int REF  a, const int b) return r(a)
  324. { r %= b;  }
  325. INLINE Int  operator << (const Int REF  a, const int b) return r(a)
  326. { r <<= b;  }
  327. INLINE Int  operator >> (const Int REF  a, const int b) return r(a)
  328. { r >>= b;  }
  329. INLINE Int  operator &  (const Int REF  a, const int b) return r(a)
  330. { r &= b;  }
  331. INLINE Int  operator |  (const Int REF  a, const int b) return r(a)
  332. { r |= b;  }
  333. INLINE Int  operator ^  (const Int REF  a, const int b) return r(a)
  334. { r ^= b;  }
  335.  
  336. INLINE Int  operator +  (const int a, const Int REF  b) return r(a)
  337. { r += b.Int::val();  }
  338. INLINE Int  operator -  (const int a, const Int REF  b) return r(a)
  339. { r -= b.Int::val();  }
  340. INLINE Int  operator *  (const int a, const Int REF  b) return r(a)
  341. { r *= b.Int::val();  }
  342. INLINE Int  operator /  (const int a, const Int REF  b) return r(a)
  343. { r /= b.Int::val();  }
  344. INLINE Int  operator %  (const int a, const Int REF  b) return r(a)
  345. { r %= b.Int::val();  }
  346. INLINE Int  operator << (const int a, const Int REF  b) return r(a)
  347. { r <<= b.Int::val();  }
  348. INLINE Int  operator >> (const int a, const Int REF  b) return r(a)
  349. { r >>= b.Int::val();  }
  350. INLINE Int  operator &  (const int a, const Int REF  b) return r(a)
  351. { r &= b.Int::val();  }
  352. INLINE Int  operator |  (const int a, const Int REF  b) return r(a)
  353. { r |= b.Int::val();  }
  354. INLINE Int  operator ^  (const int a, const Int REF  b) return r(a)
  355. { r ^= b.Int::val();  }
  356.  
  357. #endif
  358.  
  359. INLINE int  operator !  (const Int REF  a) { return !a.Int::val(); }
  360.  
  361. INLINE int  operator == (const Int REF  a, const Int REF  b) 
  362. { return a.Int::val() == b.Int::val(); }
  363. INLINE int  operator != (const Int REF  a, const Int REF  b) 
  364. { return a.Int::val() != b.Int::val(); }
  365. INLINE int  operator <  (const Int REF  a, const Int REF  b) 
  366. { return a.Int::val() <  b.Int::val(); }
  367. INLINE int  operator <= (const Int REF  a, const Int REF  b) 
  368. { return a.Int::val() <= b.Int::val(); }
  369. INLINE int  operator >  (const Int REF  a, const Int REF  b) 
  370. { return a.Int::val() >  b.Int::val(); }
  371. INLINE int  operator >= (const Int REF  a, const Int REF  b) 
  372. { return a.Int::val() >= b.Int::val(); }
  373.  
  374. INLINE int  operator == (const Int REF  a, const int b) 
  375. { return a.Int::val() == b; }
  376. INLINE int  operator != (const Int REF  a, const int b) 
  377. { return a.Int::val() != b; }
  378. INLINE int  operator <  (const Int REF  a, const int b) 
  379. { return a.Int::val() <  b; }
  380. INLINE int  operator <= (const Int REF  a, const int b) 
  381. { return a.Int::val() <= b; }
  382. INLINE int  operator >  (const Int REF  a, const int b) 
  383. { return a.Int::val() >  b; }
  384. INLINE int  operator >= (const Int REF  a, const int b) 
  385. { return a.Int::val() >= b; }
  386.  
  387. INLINE int  operator == (const int a, const Int REF  b) 
  388. { return a == b.Int::val(); }
  389. INLINE int  operator != (const int a, const Int REF  b) 
  390. { return a != b.Int::val(); }
  391. INLINE int  operator <  (const int a, const Int REF  b) 
  392. { return a <  b.Int::val(); }
  393. INLINE int  operator <= (const int a, const Int REF  b) 
  394. { return a <= b.Int::val(); }
  395. INLINE int  operator >  (const int a, const Int REF  b) 
  396. { return a >  b.Int::val(); }
  397. INLINE int  operator >= (const int a, const Int REF  b) 
  398. { return a >= b.Int::val(); }
  399.  
  400. #endif
  401. #endif
  402.